<html>
  <head>
    <script>
      var oldHistoryObject = null;

      function test(event) {
        if (!opener.scrollRestorationTest) {
          opener.scrollRestorationTest = 0;
        }
        ++opener.scrollRestorationTest;

        switch (opener.scrollRestorationTest) {
          case 1: {
            opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
            opener.ok(history.scrollRestoration, "History object has scrollRestoration property.");
            opener.ok(history.scrollRestoration, "auto", "history.scrollRestoration's default value should be 'auto'.");
            history.scrollRestoration = "foobar";
            opener.ok(history.scrollRestoration, "auto", "Invalid enum value should not change the value of an attribute.");
            history.scrollRestoration = "manual";
            opener.ok(history.scrollRestoration, "manual", "Valid enum value should change the value of an attribute.");
            history.scrollRestoration = "auto";
            opener.ok(history.scrollRestoration, "auto", "Valid enum value should change the value of an attribute.");
            document.getElementById("bottom").scrollIntoView();
            window.location.reload(false);
            break;
          }
          case 2: {
            opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
            opener.isnot(Math.round(window.scrollY), 0, "Should have restored scrolling.");
            opener.is(history.scrollRestoration, "auto", "Should have the same scrollRestoration as before reload.");
            history.scrollRestoration = "manual";
            window.onunload = function() {} // Disable bfcache.
            window.location.reload(false);
            break;
          }
          case 3: {
            opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
            opener.is(window.scrollY, 0, "Should not have restored scrolling.");
            opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration as before reload.");
            document.getElementById("bottom").scrollIntoView();
            window.onunload = null; // Should get bfcache behavior.
            opener.setTimeout("testWindow.history.back();", 250);
            window.location.href = 'about:blank';
            break;
          }
          case 4: {
            opener.is(event.persisted, true, "Should have persisted session history entry.");
            opener.isnot(Math.round(window.scrollY), 0, "Should have kept the old scroll position.");
            opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration as before reload.");
            window.scrollTo(0, 0);
            window.location.hash = "hash";
            requestAnimationFrame(test);
            break;
          }
          case 5: {
            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled to #hash.");
            opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration mode as before fragment navigation.");
            window.onunload = function() {} // Disable bfcache.
            opener.setTimeout("is(testWindow.history.scrollRestoration, 'auto'); testWindow.history.back();", 250);
            window.location.href = 'about:blank';
            break;
          }
          case 6: {
            opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
            opener.is(window.scrollY, 0, "Shouldn't have kept the old scroll position.");
            opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration mode as before fragment navigation.");
            history.scrollRestoration = "auto";
            document.getElementById("bottom").scrollIntoView();
            history.pushState({ state: "state1" }, "state1");
            history.pushState({ state: "state2" }, "state2");
            window.scrollTo(0, 0);
            history.back();
            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled back to the state1's position");
            opener.is(history.state.state, "state1", "Unexpected state.");

            history.scrollRestoration = "manual";
            document.getElementById("bottom").scrollIntoView();
            history.pushState({ state: "state3" }, "state3");
            history.pushState({ state: "state4" }, "state4");
            window.scrollTo(0, 0);
            history.back();
            opener.is(Math.round(window.scrollY), 0, "Shouldn't have scrolled back to the state3's position");
            opener.is(history.state.state, "state3", "Unexpected state.");

            history.pushState({ state: "state5" }, "state5");
            history.scrollRestoration = "auto";
            document.getElementById("bottom").scrollIntoView();
            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled to 'bottom'.");
            history.back();
            window.scrollTo(0, 0);
            history.forward();
            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled back to the state5's position");

            var ifr = document.createElement("iframe");
            ifr.src = "data:text/html,";
            document.body.appendChild(ifr);
            ifr.onload = test;
            break;
          }
          case 7: {
            oldHistoryObject = event.target.contentWindow.history;
            event.target.src = "about:blank";
            break;
          }
          case 8: {
            try {
              var sr = oldHistoryObject.scrollRestoration;
              opener.ok(false, "Should have thrown an exception.");
            } catch(ex) {
              opener.isnot(ex, null, "Did get an exception");
            }
            try {
              oldHistoryObject.scrollRestoration = "auto";
              opener.ok(false, "Should have thrown an exception.");
            } catch(ex) {
              opener.isnot(ex, null, "Did get an exception");
            }
            opener.nextTest();
            window.close();
            break;
          }
        }
      }

      window.addEventListener("pageshow",
          function(e) {
            setTimeout(test, 0, e);
          });
    </script>
  </head>
  <body>
  <div style="border: 1px solid black; height: 5000px;">
  &nbsp;</div>
  <div id="bottom">Hello world</div>
  <a href="#hash" name="hash">hash</a>
  </body>
</html>
